#ifndef CLI_MANAGER_H
#define CLI_MANAGER_H

#include "node_manager.h"
#include <string>
#include <map>
#include <memory>

/**
 * 命令行管理器类
 * 负责处理用户命令行交互，管理节点的创建、删除、状态显示等操作
 */
class CliManager {
public:
    /**
     * 构造函数
     * @param etcdUrl ETCD服务器URL
     */
    CliManager(const std::string& etcdUrl);
    
    /**
     * 析构函数
     */
    ~CliManager();
    
    /**
     * 运行命令行界面
     */
    void run();

private:
    /**
     * 显示帮助信息
     */
    void showHelp();
    
    /**
     * 创建节点
     * @param nodeId 节点ID
     * @param endpoint 节点终端点
     */
    void createNode(const std::string& nodeId, const std::string& endpoint);
    
    /**
     * 删除节点
     * @param nodeId 节点ID
     * @param removePersistent 是否同时删除持久化信息，默认为false
     */
    void deleteNode(const std::string& nodeId, bool removePersistent = false);
    
    /**
     * 列出所有节点
     */
    void listNodes();
    
    /**
     * 显示主节点
     */
    void showLeader();
    
    /**
     * 模拟节点故障
     * @param nodeId 节点ID
     */
    void simulateFault(const std::string& nodeId);
    
    /**
     * 模拟节点恢复
     * @param nodeId 节点ID
     */
    void simulateRecover(const std::string& nodeId);
    
    /**
     * 处理命令
     * @param command 命令字符串
     */
    void processCommand(const std::string& command);
    
    /**
     * 加载持久化节点
     * 从ETCD加载持久化的节点信息并初始化这些节点
     */
    void loadPersistentNodes();
    
    /**
     * 从持久化存储恢复故障节点
     * @param nodeId 节点ID
     * @return 成功返回true，失败返回false
     */
    bool recoverFaultNode(const std::string& nodeId);

private:
    std::string m_etcdUrl;                      ///< ETCD服务器URL
    std::map<std::string, NodeManager*> m_nodes; ///< 节点映射表，键为节点ID，值为节点管理器
};

#endif // CLI_MANAGER_H 